using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using WebAPI.Dtos;

namespace WebAPI.Controllers;

[Route("api/[controller]")] //用户指定路由前缀 api/user
[ApiController]
// [ApiController] 实际上包含了以下特性：它是一个组合注解
// [Controller]: 标记当前类为控制器。
// [Produces("application/json")]: 设置默认的响应内容类型为 JSON。
// [ProducesResponseType(StatusCodes.Status400BadRequest)]: 设置默认的错误响应状态码为 400 Bad Request。
// [Consumes("application/json")]: 设置默认的请求内容类型为 JSON。
// [ApiControllerExceptionFilter]: 提供异常过滤器，用于处理未捕获的异常。
public class UserController : ControllerBase {
    private readonly UserManager<IdentityUser> _userManager;

    //通过依赖注入（di），UserController 可以获取所需的 UserManager<IdentityUser> 实例，而不需要自己创建或管理这个实例。
    public UserController(UserManager<IdentityUser> userManager) {
        _userManager = userManager;
    }

    /**
     * 根据用户昵称，获取用户信息
     */
    [HttpGet("{userName}")]
    public async Task<IActionResult> GetUserByName(string userName) {
        var result = await _userManager.FindByNameAsync(userName);
        return  Ok(result);
    }

    /**
     * 添加用户
     */
    [HttpPost]
    //为什么用IActionResult返回？
    //1 可以返回多种类型的响应结果，包括但不限于 OkObjectResult, BadRequestObjectResult, CreatedAtActionResult, NotFoundResult 等。
    //2 使用 IActionResult 可以统一处理各种类型的响应结果，使得代码更加整洁和一致
    public async Task<IActionResult> AddUser([FromBody] UserDto userDto) {
        var user = new IdentityUser();
        user.UserName = userDto.UserName;
        user.NormalizedUserName = userDto.UserName.ToLower();//用于存储经过规范化处理后的用户名，用于将字符串中的所有字符转换为小写
        user.EmailConfirmed = true;//邮件确认，设置为true，否则无法登录
        user.SecurityStamp = DateTime.Now.Ticks.ToString();//用于存储与用户相关的安全信息。它通常用于跟踪用户的认证状态和安全相关信息，例如密码哈希、登录尝试次数等
        var passwordHasher = new PasswordHasher<IdentityUser>();
        user.PasswordHash = passwordHasher.HashPassword(user, userDto.Password);//使用 passwordHasher 对象的 HashPassword 方法对用户密码进行哈希处理
        var result = await _userManager.CreateAsync(user);
        return Ok(result);
    }
}